package com.qezhhnjy.huawei.topic2;

import java.util.Scanner;

/**
 * @author qezhhnjy
 * @date 2021/6/21-23:12
 * 子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
 * 子网掩码与IP地址结构相同，是32位二进制数，其中网络号部分全为“1”和主机号部分全为“0”。利用子网掩码可以判断两台主机是否中同一子网中。
 * 若两台主机的IP地址分别与它们的子网掩码相“与”后的结果相同，则说明这两台主机在同一子网中。
 * <p>
 * 示例：
 * I P 地址　 192.168.0.1
 * 子网掩码　 255.255.255.0
 * <p>
 * 转化为二进制进行运算：
 * <p>
 * I P 地址　  11000000.10101000.00000000.00000001
 * 子网掩码　11111111.11111111.11111111.00000000
 * <p>
 * AND运算   11000000.10101000.00000000.00000000
 * <p>
 * 转化为十进制后为：
 * 192.168.0.0
 * <p>
 * <p>
 * I P 地址　 192.168.0.254
 * 子网掩码　 255.255.255.0
 * <p>
 * <p>
 * 转化为二进制进行运算：
 * <p>
 * I P 地址　11000000.10101000.00000000.11111110
 * 子网掩码  11111111.11111111.11111111.00000000
 * <p>
 * AND运算  11000000.10101000.00000000.00000000
 * <p>
 * 转化为十进制后为：
 * 192.168.0.0
 * <p>
 * 通过以上对两台计算机IP地址与子网掩码的AND运算后，我们可以看到它运算结果是一样的。均为192.168.0.0，所以这二台计算机可视为是同一子网络。
 * <p>
 * 输入一个子网掩码以及两个ip地址，判断这两个ip地址是否是一个子网络。
 * 若IP地址或子网掩码格式非法则输出1，若IP1与IP2属于同一子网络输出0，若IP1与IP2不属于同一子网络输出2。
 * <p>
 * 注:
 * 有效掩码与IP的性质为：
 * 1. 掩码与IP每一段在 0 - 255 之间
 * 2. 掩码的二进制字符串前缀为网络号，都由‘1’组成；后缀为主机号，都由'0'组成
 * <p>
 * <p>
 * <p>
 * 输入描述：
 * 多组输入，一组3行，第1行是输入子网掩码、第2，3行是输入两个ip地址
 * <p>
 * 输出描述：
 * 若IP地址或子网掩码格式非法则输出1，若IP1与IP2属于同一子网络输出0，若IP1与IP2不属于同一子网络输出2
 * <p>
 * 示例1
 * 输入：
 * 255.255.255.0
 * 192.168.224.256
 * 192.168.10.4
 * 255.0.0.0
 * 193.194.202.15
 * 232.43.7.59
 * 255.255.255.0
 * 192.168.0.254
 * 192.168.0.1
 * 复制
 * 输出：
 * 1
 * 2
 * 0
 * 复制
 * 说明：
 * 对于第一个例子:
 * 255.255.255.0
 * 192.168.224.256
 * 192.168.10.4
 * 其中IP:192.168.224.256不合法，输出1
 * <p>
 * 对于第二个例子:
 * 255.0.0.0
 * 193.194.202.15
 * 232.43.7.59
 * 2个与运算之后，不在同一个子网，输出2
 * <p>
 * 对于第三个例子，2个与运算之后，如题目描述所示，在同一个子网，输出0
 */
public class Topic38 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            int mask = convert(in.nextLine());
            int ip1 = convert(in.nextLine());
            int ip2 = convert(in.nextLine());
            if (mask == -1 || ip1 == -1 || ip2 == -1 || ((mask | mask - 1) != -1)) System.out.println(1);
            else if ((ip1 & mask) == (ip2 & mask)) System.out.println(0);
            else System.out.println(2);
            System.out.println();
        }
    }

    public static int convert(String data) {
        String[] split = data.split("\\.");
        int result = 0;
        if (split.length != 4) return -1;
        for (int i = 0; i < split.length; i++) {
            try {
                int v = Integer.parseInt(split[i]);
                if (v < 0 || v > 255) return -1;
                result += v << (8 * (3 - i));
            } catch (Exception e) {
                return -1;
            }
        }
        return result;
    }
}
